package org.grottarossa.aeroflow.data;

import java.util.ArrayList;

import org.grottarossa.data.Query;
import org.grottarossa.data.exception.QueryException;
import org.grottarossa.driver.ECMBuilderTemplate;
import org.grottarossa.template.data.enums.EnumDataType;
import org.grottarossa.template.data.pojo.table.Cell;
import org.grottarossa.template.data.pojo.table.Record;
import org.grottarossa.template.data.pojo.table.Table;
import org.grottarossa.template.data.pojo.users.User;
import org.grottarossa.template.data.pojo.users.UserList;
import org.grottarossa.template.data.pojo.utils.Container;


/**
*
* La classe implementa il meccanismo per il recupero dei fields relativi ai ruoli utente di aeroflow
*
* @author Marco Sabatini (sabatini.m@gmail.com)
* @author Maurizio Farina (maurizio.farina@gmail.com)
* @author Marco Trischitta (marco.trischitta@gmail.com)
*
* @version %I%, %G%
* @since 1.0
*
* */
public class RolesQuery extends Query
{
	public RolesQuery(ECMBuilderTemplate builder)
	{
		super(builder);
	}


	/**
	 * Il metodo esegue la query che recupera i valori del field da recuperare.
	 *
	 * @param type E' un'oggetto di tipo ResultSetType serve per indicare il tipo di container che il metodo deve fornire
	 * @return Container E' il container in cui vengono memorizzate le informazioni e passate alla parte di front-end
	 *
	 * */
	@Override
	public Container execute(ResultSetType type) throws QueryException
	{
		Table table = new Table();

		UserList users = m_builder.getUserManagement().getUsers(null);

		this.setMasterPropertyName("value");
		this.setStoragePropertyName("value");

		table.getHeader().add(new Cell("key", EnumDataType.String, "key"));
		table.getHeader().add(new Cell("value", EnumDataType.String, "value"));

		ArrayList<String> addedRoles = new ArrayList<String>();

		if(filter.getFilter(User.LOGIN_ID)!=null)
		{
			for(Object user : filter.getFilter(User.LOGIN_ID))
			{
				ArrayList<String> roles = users.getUsersHashMap().get(user).getRoles();

				for(String role : roles)
				{
					addRoleToList(table, addedRoles, role);
				}
			}
		}
		else
		{
			for(User u : users)
			{
				for(String role:u.getRoles())//for earch role of a user in user list
				{
					addRoleToList(table, addedRoles, role);
				}
			}
		}

		return table;
	}

	private void addRoleToList(Table table, ArrayList<String> addedRoles,
			String role)
	{
		if(!addedRoles.contains(role))
		{
			addedRoles.add(role);
			Record record = new Record();
			record.add(new Cell("key", EnumDataType.String, role));
			record.add(new Cell("value", EnumDataType.String, role));
			table.getRecords().add(record);
		}
	}



}
